package com.shenqi.language.service;

import java.util.List;
import java.util.Map;

import com.shenqi.language.domain.Vocabulary;
import com.shenqi.language.vo.VocabularyWithUserMarkVO;

/**
 * 词条Service接口
 * 
 * @author shenqi
 * @date 2025-08-05
 */
public interface IVocabularyService 
{
    /**
     * 查询词条
     * 
     * @param id 词条主键
     * @return 词条
     */
    public Vocabulary selectVocabularyById(Long id);

    /**
     * 查询词条列表
     * 
     * @param vocabulary 词条
     * @return 词条集合
     */
    public List<Vocabulary> selectVocabularyList(Vocabulary vocabulary);

    /**
     * 新增词条
     * 
     * @param vocabulary 词条
     * @return 结果
     */
    public int insertVocabulary(Vocabulary vocabulary);

    /**
     * 修改词条
     * 
     * @param vocabulary 词条
     * @return 结果
     */
    public int updateVocabulary(Vocabulary vocabulary);

    /**
     * 批量删除词条
     * 
     * @param ids 需要删除的词条主键集合
     * @return 结果
     */
    public int deleteVocabularyByIds(Long[] ids);

    /**
     * 删除词条信息
     * 
     * @param id 词条主键
     * @return 结果
     */
    public int deleteVocabularyById(Long id);

    /**
     * 查询某个分类下的单词，分类节点包括下面的所有子节点
     * @param categoryIds
     * @return
     */
    List<Vocabulary> findVocabularyUnderCategory(List<Long> categoryIds);

    /**
     * 查询某个分类下的单词，分类节点包括下面的所有子节点,带有用户标记
     * @param categoryIds
     * @return
     */
    List<VocabularyWithUserMarkVO> selectByCategoryIdsWithUserMark(List<Long> categoryIds, Integer userMarkStatus);

    /**
     * 获取分类下的随机词条
     * @param categoryIds
     * @return
     */
    List<Vocabulary> selectRandomVocabularyList(List<Long> categoryIds);

    /**
     * 听写的时候用的接口。根据多个条件获取单词。
     * @param categoryIds
     * @param userMark
     * @param userId
     * @param isSorted: true排序，false乱序。
     * @return
     */
    List<VocabularyWithUserMarkVO> selectRandomVocabularyByCategoryIdsAndUserMark(List<Long> categoryIds, Integer userMark, Long userId, Boolean isSorted);

    /**
     * 获取分数下的各个标记的数量
     * @param categoryIds
     * @param userId
     * @return
     */
    Map<String, Integer> countUserMarksByCategoryIds(List<Long> categoryIds, Long userId);
}
